package modules.lock.producers3;

/**
 * 原始的 生产者和消费者
 * 票 - 资源类
 *    if 改为while即可，防止虚假唤醒
 *    wait 等待
 *    notifyAll  通知其他线程
 * @author shengren.yan
 * @create 2021-03-05
 */
public class Ticket3 {

    private int number = 0;

    // +1
    public synchronized void increment(){
        // 值不等于0 ，该线程需要等待，等待别的线程要增
        while (number!=0){
            try {
                this.wait(); //等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        number++;
        System.out.println(Thread.currentThread().getName() + "执行："+ number);
        // 通知其他线程
        this.notifyAll();
    }

    // -1
    public synchronized void decrement(){
        // 值等于0 ，该线程需要等待，等待别的线程要减
        while(number==0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        number--;
        System.out.println(Thread.currentThread().getName() + "执行："+ number);
        this.notifyAll();
    }


}